package org.ciallo.simplemusicplayer.util;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.concurrent.TimeUnit;

/**
 * @author Jukomu
 * @Description: 时间处理相关的工具类
 * @Package: org.ciallo.simplemusicplayer.util
 * @Project: SimpleMusicPlayer
 * @name: TimeUtil
 * @Date: 2025/5/27-02:31
 * @Filename: TimeUtil
 */
public class TimeUtil {
    /**
     * 将毫秒时长格式化为 "mm:ss" 或 "hh:mm:ss" (如果超过一小时) 的字符串格式。
     *
     * @param millis 要格式化的毫秒时长。
     * @return 格式化后的时间字符串，例如 "03:45" 或 "01:15:30"。
     * 如果输入为负数，则视为0。
     */
    public static String formatDuration(long millis) {
        if (millis < 0) {
            millis = 0; // 将负数时长视为0
        }

        // 将毫秒转换为小时、分钟和秒
        long hours = TimeUnit.MILLISECONDS.toHours(millis);
        long minutes = TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(hours);
        // 计算秒时，需要减去已经转换为分钟的总秒数，而不是减去(分钟数 * 60)
        long seconds = TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis));

        if (hours > 0) {
            // 如果有时长大于等于1小时，格式化为 "hh:mm:ss"
            return String.format(Locale.getDefault(), "%02d:%02d:%02d", hours, minutes, seconds);
        } else {
            // 如果时长小于1小时，格式化为 "mm:ss"
            return String.format(Locale.getDefault(), "%02d:%02d", minutes, seconds);
        }
    }

    /**
     * 将给定的时间戳（通常是自新纪元以来的毫秒数）格式化为指定的日期字符串模式。
     *
     * @param timestamp     要格式化的时间戳 (毫秒)。
     * @param formatPattern SimpleDateFormat 使用的日期和时间格式模式，例如 "yyyy-MM-dd HH:mm:ss"。
     * @return 格式化后的日期时间字符串。如果时间戳无效（小于等于0），则返回空字符串。
     */
    public static String formatDate(long timestamp, String formatPattern) {
        if (timestamp <= 0) {
            return ""; // 对于无效时间戳返回空字符串
        }
        try {
            SimpleDateFormat sdf = new SimpleDateFormat(formatPattern, Locale.getDefault());
            return sdf.format(new Date(timestamp));
        } catch (Exception e) {
            // Log the exception, and return a fallback or empty string
            // Timber.e(e, "Error formatting date with timestamp: %d and pattern: %s", timestamp, formatPattern);
            return ""; // 格式化失败也返回空字符串
        }
    }

    /**
     * 将给定的时间戳格式化为 "yyyy-MM-dd" 格式的日期字符串。
     *
     * @param timestamp 要格式化的时间戳 (毫秒)。
     * @return "yyyy-MM-dd" 格式的日期字符串。
     */
    public static String formatSimpleDate(long timestamp) {
        return formatDate(timestamp, "yyyy-MM-dd");
    }

    /**
     * 将给定的时间戳格式化为 "HH:mm:ss" 格式的时间字符串。
     *
     * @param timestamp 要格式化的时间戳 (毫秒)。
     * @return "HH:mm:ss" 格式的时间字符串。
     */
    public static String formatSimpleTime(long timestamp) {
        return formatDate(timestamp, "HH:mm:ss");
    }
}
